package com.shuang.link6;

public class GetIntersectionNode {

    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
      /*  //1 求出两个链表的长度 算出长度差 先让长的走到跟短的末尾对齐 再两个同时走找到相同的就返回即可

        ListNode pA = headA;
        ListNode pB = headB;

        int lenA = 0;
        int lenB = 0;
        //计算两个链表长度
        while (pA != null){
            lenA++;
            pA = pA.next;
        }

        while (pB != null){
            lenB++;
            pB = pB.next;
        }

        pA = headA;
        pB = headB;

        //让A的长度为长的那个链表 如果B长则交换AB长度和头节点
        if (lenB > lenA){
            int tempA = lenA;
            lenA = lenB;
            lenB = tempA;

            ListNode tempNodeA = pA;
            pA = pB;
            pB = tempNodeA;
        }

        //长度差
        int gap = lenA - lenB;

        //让pA走到pB对其位置
        while (gap > 0){
            pA = pA.next;
            gap--;
        }

        //pA与pB同时走如果遇到相同的就返回
        while (pA != null){
            if (pA == pB){
                return pA;
            }

            pA = pA.next;
            pB = pB.next;
        }

        //没有相交返回null
        return null;

    }
*/

    //方法2 合并链表实现同步移动
    // p1 指向 A 链表头结点，p2 指向 B 链表头结点
    ListNode p1 = headA, p2 = headB;
        while (p1 != p2) {
        // p1 走一步，如果走到 A 链表末尾，转到 B 链表
        if (p1 == null) {
            p1 = headB;
        } else {
            p1 = p1.next;
        }
        // p2 走一步，如果走到 B 链表末尾，转到 A 链表
        if (p2 == null) {
            p2 = headA;
        } else {
            p2 = p2.next;
        }
    }
        return p1;
}

}
